package com.xiaoshuidi.cloud.module.contract.service.contract;

import com.xiaoshuidi.cloud.framework.common.pojo.PageResult;
import com.xiaoshuidi.cloud.module.bpm.mq.message.BpmProcessInstanceResultEvent;
import com.xiaoshuidi.cloud.module.bpm.mq.message.BpmProcessInstanceResultEvent;
import com.xiaoshuidi.cloud.module.contract.controller.admin.contract.vo.HomeQueryVO;
import com.xiaoshuidi.cloud.module.contract.controller.admin.contract.vo.ownerContract.*;
import com.xiaoshuidi.cloud.module.contract.controller.app.contract.vo.OwnerHouseInfoRespVO;
import com.xiaoshuidi.cloud.module.contract.controller.app.contract.vo.OwnerHouseRentInfoRespVO;
import com.xiaoshuidi.cloud.module.contract.controller.app.contract.vo.OwnerHouseRoomQueryReqVO;
import com.xiaoshuidi.cloud.module.contract.dal.dataobject.contract.ContractHouseOwnerDO;
import com.xiaoshuidi.cloud.module.contract.controller.admin.contract.vo.HomeQueryVO;
import com.xiaoshuidi.cloud.module.contract.dal.dataobject.contract.ContractHouseOwnerPropertyTemplateDO;
import com.xiaoshuidi.cloud.module.contract.dal.dataobject.contract.ContractHouseOwnerPropertyTemplateDO;
import com.xiaoshuidi.cloud.module.contract.service.contract.dto.ContractHouseOwnerQueryDTO;
import com.xiaoshuidi.cloud.module.contract.service.contract.dto.OwnerContractRoomDTO;
import com.xiaoshuidi.cloud.module.contract.vo.ApproveReqVO;

import java.time.LocalDate;
import java.util.List;

/**
 * 业主合同 Service 接口
 *
 * @author 合房租赁
 */
public interface ContractHouseOwnerService {

    /**
     * 创建业主合同
     *
     * @param createReqVO 创建信息
     * @return 编号
     */
    Long createHouseOwner( ContractHouseOwnerCreateReqVO createReqVO);

    /**
     * 更新业主合同
     *
     * @param updateReqVO 更新信息
     */
    void updateHouseOwner( ContractHouseOwnerUpdateReqVO updateReqVO);

    /**
     * 删除业主合同
     *
     * @param id 编号
     */
    void deleteHouseOwner(Long id, Boolean deleteBill);

    /**
     * 获得业主合同
     *
     * @param id 编号
     * @return 业主合同
     */
    ContractHouseOwnerRespVO getHouseOwnerResp(Long id);

    /**
     * 获得业主合同
     *
     * @param id 编号
     * @return 业主合同
     */
    ContractHouseOwnerDO getHouseOwner(Long id);

    /**
     * 获得业主合同分页
     *
     * @param pageReqVO 分页查询
     * @return 业主合同分页
     */
    PageResult<ContractHouseOwnerPageRespVO> getHouseOwnerPage(ContractHouseOwnerPageReqVO pageReqVO);

    /**
     * 获得业主合同列表, 用于 Excel 导出
     *
     * @param pageVO 查询条件
     * @return 业主合同列表
     */
    List<ContractHouseOwnerPageRespVO> getExportHouseOwnerList(ContractHouseOwnerPageReqVO pageVO);


    /**
     *  获取续租合同信息
     * @param id
     * @return: com.xiaoshuidi.cloud.module.contract.controller.admin.contract.vo.ownerContract.ContractHouseOwnerRespVO
     */
    ContractHouseOwnerRespVO getRenewalContract(Long id);

    /**
     * 业主合同退租
     *
     * @param reqVo
     * @return: void
     */
    void evictionOwnerContract(ContractHouseOwnerCancelReqVO reqVo);


    /**
     * 业主合同退租审批回调
     *
     * @param event
     */
    void approvalResult(BpmProcessInstanceResultEvent event);


    /**
     * 退租审批通过操作
     *
     * @param id
     * @return: void
     */
    void evictionApprovePass(Long id);

    /**
     * 取消业主续租合同
     * @param id
     * @return: void
     */
    void cancelContract(Long id);

    /**
     * 根据合同ID获取该合同续租合同
     * @param
     * @return: com.xiaoshuidi.cloud.module.contract.dal.dataobject.contract.ContractHouseOwnerDO
     */
    List<ContractHouseOwnerDO> getRenewalOwnerContractByContractId(Long contractId);

    /**
     * 续租合同状态变更
     * @param date
     * @return: void
     */
    void changeRenewalContractStatus(LocalDate date);

    /**
     * 业主合同首页分页
     * @param queryDTO
     * @return: com.xiaoshuidi.cloud.framework.common.pojo.PageResult<com.xiaoshuidi.cloud.module.contract.controller.admin.contract.vo.ownerContract.ContractHouseOwnerPageRespVO>
     */
    PageResult<ContractHouseOwnerPageRespVO> getHouseOwnerHomePage(HomeQueryVO queryDTO);

    /**
     * 会员号查询业主租金信息
     * @param memberNo
     * @return: com.xiaoshuidi.cloud.module.contract.controller.app.contract.vo.OwnerHouseRentInfoRespVO
     */
    OwnerHouseRentInfoRespVO getAppRentInfo(Long memberNo);

    /**
     * 分页查询业主合同房间信息
     * @param param
     * @return: com.xiaoshuidi.cloud.framework.common.pojo.PageResult<com.xiaoshuidi.cloud.module.contract.controller.app.contract.vo.OwnerHouseInfoRespVO>
     */
    PageResult<OwnerHouseInfoRespVO> pageAppOwnerRoomInfo(OwnerHouseRoomQueryReqVO param);

    /**
     * 业主合同首页分页总数
     * @param queryDTO
     * @return: java.lang.Integer
     */
    Integer countHouseOwnerHomePage(HomeQueryVO queryDTO);

    /**
     * 更新业主合同
     * @param houseOwnerDO
     * @return: void
     */
    void updateOwner(ContractHouseOwnerDO houseOwnerDO);

    /**
     * 条件查询业主合同列表
     * @param param
     * @return: java.util.List<com.xiaoshuidi.cloud.module.contract.dal.dataobject.contract.ContractHouseOwnerDO>
     */
    List<ContractHouseOwnerDO> getByParam(ContractHouseOwnerQueryDTO param);

    void updateContractStatus(ApproveReqVO approveReqVO);

    /**
     * 回调签约成功处理
     * @param ownerContractId
     * @return: void
     */
    void callbackSignSuccess(Long ownerContractId);

    void updateMemberUser(Long userId, String mobile, String userName, Long oldUserId);

    /**
     * 根据房间号查询业主合同信息
     * @param roomIds
     * @return: java.util.List<com.xiaoshuidi.cloud.module.contract.service.contract.dto.OwnerContractRoomDTO>
     */
    List<OwnerContractRoomDTO> getOwnerOrderByRoomIds(List<Long> roomIds);

    /**
     * 业主合同续租判断原合同是否所有账单都支付完成
     * @param id
     * @return: java.lang.Boolean
     */
    Boolean checkRenewal(Long id);

    /**
     * 更新业主合同银行卡信息
     *
     * @param updateReqVO 更新信息
     */
    void updateHouseOwnerCard( ContractHouseOwnerCardUpdateReqVO updateReqVO);

    /**
     * 业主合同业主资产初始数据
     * @param apartmentId
     * @return: java.util.List<com.xiaoshuidi.cloud.module.contract.dal.dataobject.contract.ContractHouseOwnerPropertyTemplateDO>
     */
    List<ContractHouseOwnerPropertyTemplateDO> ownerPropertyTemplateList(Long apartmentId);

    /**
     * 查询业主合同信息（带关联房间）
     * @param id
     * @return: com.xiaoshuidi.cloud.module.contract.controller.admin.contract.vo.ownerContract.ContractHouseOwnerRespVO
     */
    ContractHouseOwnerRespVO getHouseOwnerWithRefRoom(Long id);

    Boolean changeHousekeep(ChangeHousekeepReqVO reqVO);
}
